/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EAutor;
import LogicaNegocio.Biblioteca.Autor;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Autor en la base de datos BiblioSoft.
 *
 * @author sebaxtian
 * Archivo: ManagerAutor.java
 * @version 1.0
 * Fecha: sáb may  1 18:51:15 COT 2010
 */


public class ManagerAutor {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Autor
     * 
     */
    public ManagerAutor() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Este metodo se encarga de la persistencia en la entidad Autor
     * de un objeto Autor.
     *
     * @param autor
     */
    public void crearAutor(Autor autor) throws RollbackException, EntityExistsException {
        entityManager.clear();
        EAutor entidadAutor = new EAutor();
        entidadAutor.setCodigoautor(autor.getCodigoAutor());
        entidadAutor.setPrimerapellido(autor.getPrimerApellido());
        entidadAutor.setPrimernombre(autor.getPrimerNombre());
        entidadAutor.setSegundoapellido(autor.getSegundoApellido());
        entidadAutor.setSegundonombre(autor.getSegundoNombre());
        //persiste el objeto en la entidad
        EntityTransaction transaccion = entityManager.getTransaction();
        try{
        transaccion.begin();
        entityManager.persist(entidadAutor);
        } catch (EntityExistsException ex) {
            throw ex;
        } finally {
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Este metodo actualiza un autor de la base de datos.
     *
     * @param codigoAutor
     * @param autor
     */
    public void actualizarAutor(int codigoAutor, Autor autor) {
        entityManager.clear();
        EAutor entidadAutor;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadAutor = entityManager.find(EAutor.class, codigoAutor);
        transaccion.commit();
        if(entidadAutor != null){
            entidadAutor.setCodigoautor(autor.getCodigoAutor());
            entidadAutor.setPrimerapellido(autor.getPrimerApellido());
            entidadAutor.setPrimernombre(autor.getPrimerNombre());
            entidadAutor.setSegundoapellido(autor.getSegundoApellido());
            entidadAutor.setSegundonombre(autor.getSegundoNombre());
            transaccion.begin();
            entityManager.merge(entidadAutor);
            transaccion.commit();
            Query consulta = entityManager.createQuery("UPDATE EEscrito e SET e.eEscritoPK.codigoautor = :codigoautornuevo WHERE e.eEscritoPK.codigoautor = :codigoautoranterior");
            consulta.setParameter("codigoautornuevo", autor.getCodigoAutor());
            consulta.setParameter("codigoautoranterior", codigoAutor);
            transaccion.begin();
            consulta.executeUpdate();
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Este metodo permite obtener el autor identificado
     * con el codigo de autor.
     * Si no se encuentra retorna null
     *
     * @param codigoAutor
     * @return autor
     */
    public Autor obtenerAutor(int codigoAutor) {
        entityManager.clear();
        EAutor entidadAutor;
        Autor autor = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadAutor = entityManager.find(EAutor.class, codigoAutor);
        transaccion.commit();
        if(entidadAutor != null){
            autor = new Autor();
            autor.setCodigoAutor(entidadAutor.getCodigoautor());
            autor.setPrimerApellido(entidadAutor.getPrimerapellido());
            autor.setPrimerNombre(entidadAutor.getPrimernombre());
            autor.setSegundoApellido(entidadAutor.getSegundoapellido());
            autor.setSegundoNombre(entidadAutor.getSegundonombre());
        }
        entityManager.clear();
        return autor;
    }
    
}
